package com.ppt.javappt.entity;

import com.ppt.javappt.component.TextBox;
import javafx.scene.Node;
import javafx.beans.value.ChangeListener;
import javafx.scene.control.TextArea;
/**
 * 节点属性监听器处理器接口：定义添加/移除监听器的规范
 * 采用策略模式  提高维护性
 * @author cys
 */
public interface NodePropertyHandler {
    /**
     * 为节点添加属性监听器（包括特有属性）
     * @param node 目标节点
     * @param listener 通用的属性变化监听器（最终触发updateThumbnail）
     */
    void addPropertyListeners(Node node, ChangeListener<Object> listener);

    /**
     * 从节点移除属性监听器（避免内存泄漏）
     * @param node 目标节点
     * @param listener 通用的属性变化监听器
     */
    void removePropertyListeners(Node node, ChangeListener<Object> listener);

    /**
     * 判断当前处理器是否支持该节点类型
     * @param node 目标节点
     * @return 是否支持（true：支持，false：不支持）
     */
    boolean supports(Node node);
}

/**
 * 通用节点属性处理器：处理所有节点共有的属性（如位置、可见性）
 */
class CommonNodePropertyHandler implements NodePropertyHandler {
    @Override
    public void addPropertyListeners(Node node, ChangeListener<Object> listener) {
        // 通用属性：所有节点都需要监听的属性
        node.layoutXProperty().addListener(listener);
        node.layoutYProperty().addListener(listener);
        node.visibleProperty().addListener(listener);
        node.opacityProperty().addListener(listener);
    }

    @Override
    public void removePropertyListeners(Node node, ChangeListener<Object> listener) {
        // 对应移除通用属性的监听器
        node.layoutXProperty().removeListener(listener);
        node.layoutYProperty().removeListener(listener);
        node.visibleProperty().removeListener(listener);
        node.opacityProperty().removeListener(listener);
    }

    @Override
    public boolean supports(Node node) {
        // 通用处理器支持所有节点
        return true;
    }
}

/**
 * 文本框属性处理器：
 * 属性：文本 + 字体
 */
class TextBoxPropertyHandler implements NodePropertyHandler {
    @Override
    public void addPropertyListeners(Node node, ChangeListener<Object> listener) {
        TextBox text = (TextBox)node;
        // 特有属性
        text.textProperty().addListener(listener);
        text.fontProperty().addListener(listener);
        text.prefWidthProperty().addListener(listener);
        text.prefHeightProperty().addListener(listener);
        text.styleProperty().addListener(listener);
    }

    @Override
    public void removePropertyListeners(Node node, ChangeListener<Object> listener) {
        TextBox text = (TextBox)node;
        // 特有属性
        text.textProperty().removeListener(listener);
        text.fontProperty().removeListener(listener);
        text.prefWidthProperty().removeListener(listener);
        text.prefHeightProperty().removeListener(listener);
        text.styleProperty().removeListener(listener);
    }

    @Override
    public boolean supports(Node node) {
        // 仅支持文本节点
        return node instanceof TextBox;
    }
}


